package com.smart.community.feign.property.service;

import com.smart.community.feign.property.fallback.PropertyCompanyCommunityFeignFallback;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 物业公司社区关联Feign接口
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-06-29
 */
@Tag(name = "物业公司社区关联Feign接口", description = "物业公司社区关联相关Feign接口")
@FeignClient(
    name = "smart-community-property",
    path = "/property",
    fallback = PropertyCompanyCommunityFeignFallback.class,
    contextId = "iPropertyCompanyCommunityFeign"
)
public interface IPropertyCompanyCommunityFeign {
    
    /**
     * 分配社区给物业公司
     * 
     * @param propertyCompanyId 物业公司ID
     * @param communityIds 社区ID列表
     * @return 操作结果
     */
    @Operation(summary = "分配社区给物业公司")
    @PostMapping("/feign/company-communities/assign/{propertyCompanyId}")
    void assignCommunities(
        @Parameter(description = "物业公司ID") @PathVariable("propertyCompanyId") Long propertyCompanyId,
        @Parameter(description = "社区ID列表") @RequestBody List<Long> communityIds
    );
    
    /**
     * 根据物业公司ID查询关联的社区列表
     * 
     * @param propertyCompanyId 物业公司ID
     * @return 社区ID列表
     */
    @Operation(summary = "根据物业公司ID查询关联的社区列表")
    @GetMapping("/feign/company-communities/property-company/{propertyCompanyId}")
    List<Long> getCommunityIdsByPropertyCompanyId(@Parameter(description = "物业公司ID") @PathVariable("propertyCompanyId") Long propertyCompanyId);
    
    /**
     * 检查物业公司是否关联指定社区
     * 
     * @param propertyCompanyId 物业公司ID
     * @param communityId 社区ID
     * @return 是否关联
     */
    @Operation(summary = "检查物业公司是否关联指定社区")
    @GetMapping("/feign/company-communities/check/{propertyCompanyId}/{communityId}")
    Boolean checkPropertyCompanyHasCommunity(
        @Parameter(description = "物业公司ID") @PathVariable("propertyCompanyId") Long propertyCompanyId,
        @Parameter(description = "社区ID") @PathVariable("communityId") Long communityId
    );
    
    /**
     * 根据社区ID获取物业公司ID
     * 
     * @param communityId 社区ID
     * @return 物业公司ID，如果没有关联则返回null
     */
    @Operation(summary = "根据社区ID获取物业公司ID")
    @GetMapping("/feign/company-communities/property-company-by-community/{communityId}")
    Long getPropertyCompanyIdByCommunityId(@Parameter(description = "社区ID") @PathVariable("communityId") Long communityId);

    /**
     * 移除物业公司与社区的关联
     * 
     * @param id 关联ID
     * @return 操作结果
     */
    @Operation(summary = "移除物业公司与社区的关联")
    @DeleteMapping("/feign/company-communities/{id}")
    void removeCommunityRelation(@Parameter(description = "关联ID") @PathVariable("id") Long id);
    
    /**
     * 批量移除物业公司与社区的关联
     * 
     * @param propertyCompanyId 物业公司ID
     * @return 操作结果
     */
    @Operation(summary = "批量移除物业公司与社区的关联")
    @DeleteMapping("/batch/{propertyCompanyId}")
    void removeCommunityRelations(@Parameter(description = "物业公司ID") @PathVariable("propertyCompanyId") Long propertyCompanyId);
    
    /**
     * 批量根据物业公司ID列表获取社区ID列表
     * 
     * @param propertyCompanyIds 物业公司ID列表
     * @return 社区ID列表
     */
    @Operation(summary = "批量根据物业公司ID列表获取社区ID列表")
    @PostMapping("/communities-by-property-companies")
    List<Long> getCommunityIdsByPropertyCompanyIds(@Parameter(description = "物业公司ID列表") @RequestBody List<Long> propertyCompanyIds);
} 